package org.apache.ibatis.session;


import java.util.List;
import java.util.Objects;

/**
 * @Classname SqlSession
 * @Description TODO
 * @Date 2025/1/16 12:47
 * @Author zhuzhenguo
 */
public interface SqlSession {


    /**
     * 查询所有数据
     *
     * @param statementId sql语句的唯一id
     * @param params      查询sql需要的参数，参数可数量可变
     * @return {@link List}<{@link E}> 返回结果集
     * @throws Exception 例外
     */
    <E> List<E> selectList(String statementId, Object... params) throws Exception;


    /**
     * 根据条件查询单个
     *
     * @param statementId sql语句的唯一id
     * @param params      查询sql需要的参数，参数可数量可变
     * @return {@link E}  返回对象
     * @throws Exception 例外
     */
    <E> E selectOne(String statementId, Object... params) throws Exception;

    /**
     * 插入
     *
     * @param statementId sql语句的唯一id
     * @param params      查询sql需要的参数，参数可数量可变
     * @return {@link E}  返回对象
     * @throws Exception 例外
     */
    <E> E insert(String statementId, Object... params) throws Exception;

    /**
     * 根据条件更新单个
     *
     * @param statementId sql语句的唯一id
     * @param params      查询sql需要的参数，参数可数量可变
     * @return {@link E}  返回对象
     * @throws Exception 例外
     */
    <E> E update(String statementId, Object... params) throws Exception;

    /**
     * 根据条件删除单个
     *
     * @param statementId sql语句的唯一id
     * @param params      查询sql需要的参数，参数可数量可变
     * @return {@link E}  返回对象
     * @throws Exception 例外
     */
    <E> E delete(String statementId, Object... params) throws Exception;

    /**
     * 为Mapper层的接口JDK动态代理生成实现类
     *
     * @param mapperClass 字节码
     * @return {@link T} 反向的代理对象
     */
    <T> T getMapper(Class<T> mapperClass) throws Exception;

}
